﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once

#include "IUnCommandControlDefinition.h"

namespace gcmp
{
    /// \brief LineEdit的输入类型
    enum class LineEditInputType : int32_t
    {
        InputString = 0, ///< 字符串输入
        InputInt,            ///< 整型数值输入
        InputDouble         ///< 双精度浮点型数值输入
    };

    class ILineEditEvent;
    class IControlState;
    class ValidatorBase;
    class ILineEditHandler;
    /// \brief LineEdit控件数据定义接口
    class GCMP_GUI_BASE_INTERFACE_EXPORT ILineEditDefinition : public IUnCommandControlDefinition
    {
    public:
        /// \brief 创建ILineEditDefinition对象
        ///
        /// \param id       ILineEditDefinition的Id,需保证唯一性
        /// \param caption    LineEdit控件标题
        /// \param inputType  LineEdit输入格式
        /// \return  创建出ILineEditDefinition对象。失败时返回空
        static OwnerPtr<ILineEditDefinition> Create(const std::wstring& id, const std::wstring& caption, LineEditInputType inputType = LineEditInputType::InputString);

        /// \brief 创建double类型的ILineEditDefinition对象
        ///
        /// \param id       ILineEditDefinition的Id,需保证唯一性
        /// \param caption    LineEdit控件标题
        /// \param value   LineEdit里的值
        /// \param decimals 小数点个数，默认保留小数点后三位有效数字
        /// \return  创建出ILineEditDefinition对象。失败时返回空
        static OwnerPtr<ILineEditDefinition> Create(const std::wstring& id, const std::wstring& caption,double value, int decimals = 3);

        /// \brief 创建pLineEditDefinition的引用
        ///
        /// pLineEditDefinition需加到IControlDefinitionLibrary时才能创建引用对象；不能通过引用创建引用 
        /// \param pLineEditDefinition   ILineEditDefinition对象
        /// \return  创建出ILineEditDefinition对象。失败时返回空
        static OwnerPtr<ILineEditDefinition> CreateReference(const ILineEditDefinition* pLineEditDefinition);

        /// \brief 得到LineEdit输入框中的输入类型
        virtual LineEditInputType GetInputType() const = 0;

        /// \brief 得到LineEdit输入框中的文字
        virtual std::wstring GetText() const = 0;

        /// \brief 设置LineEdit输入框中的文字
        ///
        /// \param text   文字信息
        /// \return  true表示成功， false表示失败
        virtual bool SetText(const std::wstring& text)= 0;

        /// \brief 得到LineEdit输入框的状态
        virtual bool IsEditing() const = 0;
        
        /// \brief 清除LineEdit输入框中的文字
        virtual void Clear() = 0;

        /// \brief 设置lineEdit控件输入框中的文字为全选中状态
        virtual void SelectAll() = 0;

        /// \brief 得到选择的文字
        virtual std::wstring GetSelectedText() const = 0;

        /// \brief 设置LineEdit的可见、可用的状态及控件对应的处理逻辑
        /// \param pControlHandler 控件状态对象
        /// \return     true表示成功，false表示失败
        virtual bool SetControlHandler(OwnerPtr<ILineEditHandler> pControlHandler) = 0;

        /// \brief 设置LineEdit的值有效性验证器
        ///
        /// \param opValidator 验证器，若为空将清除当前已有验证器
        /// \return     true表示成功，false表示失败
        virtual bool SetValidator(OwnerPtr<ValidatorBase> opValidator) = 0;

        /// \brief 获取LineEdit的值有效性验证器
        ///
        /// \return     验证器，若没有则返回空
        virtual ValidatorBase* GetValidator() = 0;

        /// \brief 设置LineEdit的可用性（相关代码会调整，请勿使用）
        ///
        /// 通过SetControlState设置后，SetEnabled将不起作用
        /// \param enabled true代表设置可用，false代表设置不可用
        /// \return     true表示成功，false表示失败
        virtual bool SetEnabled(bool enabled) = 0;

        /// \brief 设置LineEdit的可见性（相关代码会调整，请勿使用）
        ///
        /// 通过SetControlState设置后，SetVisible将不起作用
        /// \param visible true代表设置可见，false代表设置不可见
        /// \return     true表示成功，false表示失败
        virtual bool SetVisible(bool visible) = 0;

        /// \brief 得到ILineEditEvent对象（相关代码会调整，请勿使用）
        ///
        /// \return ILineEditEvent对象
        virtual ILineEditEvent* GetEvent() const = 0;

    };
}
